<?php

namespace app\admin\controller;

require_once '../extend/oss/autoload.php';

use app\common\server\OssUp;
use app\admin\controller\Base;
use OSS\Core\OssException;
use OSS\OssClient;
use think\facade\Db;
use think\facade\Filesystem;
use think\facade\Request;

class Upload extends Base
{

    /**
     * 阿里云oss上传
     */
    public function picture()
    {
        #获取表单上传文件
        $files = request()->file('file', '');
        if (empty($files)) {
            return $this->renderError("请上传图片");
        }
        $ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif', 'apk', 'mp3'];
        $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
        if (!in_array($type, $ext)) {
            return $this->renderError("文件格式错误");
        }
        if ($_FILES['file']['size'] > 20971520) {
            return $this->renderError("上传文件不能超过20M");
        }
        #判断是否上传过
        $hash = $files->hash('sha1');
        $info = Db::name('picture')->where('token', $hash)->find();

        if ($info) {
            $data['path'] = imageUrl($info['imgurl']);
            $data['imgurl'] = $info['imgurl'];
            return $this->renderSuccess('上传成功', $data);
        } else {
            $object_file = 'storage/topic';
            // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
            $accessKeyId = 'LTAI5tRJHd6Uj8J2eWDssf11';
            $accessKeySecret = 'zrfh3ZrmSAvf0ZJAiSUKoMU5LhEQfX';
            // Endpoint以杭州为例，其它Region请按实际情况填写。
            $endpoint = 'https://oss-cn-beijing.aliyuncs.com'; 
            // 设置存储空间名称。
            $bucket = 'ouhechaowan';
            // 设置文件名称。
            $object = $object_file . '/' . date('Ymd') . '/' . sha1(date('YmdHis', time()) . uniqid()) . '.' . $type;

            // <yourLocalFile>由本地文件路径加文件名包括后缀组成，例如/users/local/myfile.txt。
            $filePath = $_FILES['file']['tmp_name'];
            try {
                $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
                $ossClient->uploadFile($bucket, $object, $filePath);
            } catch (OssException $e) {
//                dd($e->getMessage());
                return $this->renderError("上传失败");
            }
            #新增数据
            $object = '/'.$object;
            $save_data['token'] = $hash;
            $save_data['imgurl'] = $object;
            $save_data['addtime'] = time();
            $save_data['status'] = 1;
            $resultId = Db::name('picture')->insertGetId($save_data);
            if ($resultId) {
                $data['path'] = imageUrl($object);
                $data['imgurl'] = $object;
                return $this->renderSuccess('上传成功', $data);
            } else {
                return $this->renderError('上传失败');
            }
        }


    }

    /**
     * 阿里云oss上传
     */
    public function picture_other()
    {
        #获取表单上传文件
        $files = request()->file('file', '');
        if (empty($files)) {
            return $this->renderError("请上传文件");
        }
        $ext = ['apk'];
        $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
        if (!in_array($type, $ext)) {
            return $this->renderError("文件格式错误");
        }
        if ($_FILES['file']['size'] > 104857600) {
            return $this->renderError("上传文件不能超过100M");
        }
        $oss = Config::getConfigInfo('aliyun_oss');
        $object_file = 'newimage';
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
        $accessKeyId = $oss['file_accessKeyId'];
        $accessKeySecret = $oss['file_accessKeySecret'];
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        $endpoint = $oss['file_endpoint'];
        // 设置存储空间名称。
        $bucket = $oss['file_bucket'];
        // 设置文件名称。
        $object = $object_file . '/' . date('Ym') . '/' . sha1(date('YmdHis', time()) . uniqid()) . '.' . $type;
        // <yourLocalFile>由本地文件路径加文件名包括后缀组成，例如/users/local/myfile.txt。
        $filePath = $_FILES['file']['tmp_name'];
        try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
            $ossClient->uploadFile($bucket, $object, $filePath);
        } catch (OssException $e) {
            return $this->renderError("上传失败");
        }
        $data['path'] = imageUrl($object);
        $data['imgurl'] = $object;
        return $this->renderSuccess('上传成功', $data);
    }


    /**
     * 上传图片
     */
    public function picture_old()
    {
        #获取表单上传文件
        $files = request()->file('file', '');
        if (empty($files)) {
            return $this->renderError("请上传图片");
        }
        $ext = ['jpg', 'png', 'jpeg', 'JPG', 'PNG', 'JPEG', 'gif'];
        $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
        if (!in_array($type, $ext)) {
            return $this->renderError("文件格式错误");
        }
        if ($_FILES['file']['size'] > 5242880) {
            return $this->renderError("上传文件不能超过5M");
        }
        #判断是否上传过
        $hash = $files->hash('sha1');
        $info = Picture::where('token', $hash)->find();
        if ($info) {
            $data['id'] = $info['id'];
            $data['path'] = imageUrl($info['imgurl']);
            $data['imgurl'] = $info['imgurl'];
            return $this->renderSuccess('上传成功', $data);
        } else {
            #保存图片
            $savename = \think\facade\Filesystem::disk('public')->putFile('topic', $files);
            $hash = $files->hash('sha1');
            $savename = '/storage/' . $savename;
            $savename = str_replace('\\', '/', $savename);
            #新增数据
            $save_data['token'] = $hash;
            $save_data['imgurl'] = $savename;
            $save_data['addtime'] = time();
            $res = (new Picture())->save($save_data);
            if ($res) {
                $data['id'] = $res;
                $data['path'] = imageUrl($savename);
                $data['imgurl'] = $savename;
                return $this->renderSuccess('上传成功', $data);
            } else {
                return $this->renderError('上传失败');
            }
        }
    }

    /**
     * 上传证书
     */
    public function wechat_cert()
    {
        $files = request()->file('file', '');
        $ext = ['cer', 'pfx'];
        $type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.') + 1);
        if (!in_array($type, $ext)) {
            return $this->renderError("文件格式错误");
        }
        $savename = $_FILES['file']['name'];
        \think\facade\Filesystem::disk('ssl')->putFileAs('', $files, $savename);
        return $this->renderSuccess('上传成功', $savename);

    }
    
    /* 上传设置
     * @param Request $request
     * @return string
     */
    public function upload_yinyue (Request $request)
    {
        // $file = $request->file('video');
        $file = request()->file('video', '');


        // 定义上传目录
        $savePath = 'uploads/video/';

        // 检查目录是否存在，如果不存在则创建
        if (!is_dir($savePath)) {
            mkdir($savePath, 0777, true);
        }

        // 生成文件名，这里使用随机字符串和原文件扩展名
        $info = $file->move($savePath, 'unique_name_' . uniqid() . '.' . $file->getExtension());
        if (!$info) {
            // 上传失败，处理错误
            return '文件保存失败：' . $file->getError();
        }
        // 获取保存后的文件路径
        $uploadFile = $info->getRealPath();

        $object =  date('YmdHis') . rand(10, 50) . '.' . 'mp3';
        $ossUp = new OssUp();
        $result = $ossUp->upload_($object, $uploadFile);
        unlink($uploadFile);
        return $this->renderSuccess('上传成功',['url' => $result]);
    }
    
}
